package commun;

import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SealedObject;



/**
 * 
 * Cette interface permet de déclarer les méthodes utilisées lors de la connexion du client au serveur.
 * 
 * @author Valentin Brémond
 * 
 * @version 1.0
 *
 */
public interface InterfaceRMIConnexionSecurisee extends Remote
{
	/**
	 * Première méthode appelée ; elle permet de mettre en place une clé commune via la méthode de Diffie-Hellman.
	 * 
	 * @param G Le G commun aux deux parties.
	 * @param n Le n commun aux deux parties.
	 * @param X Le X du client (X = G^x (mod n)).
	 * 
	 * @return Le Y du serveur (Y = G^y (mod n)).
	 * 
	 * @throws RemoteException
	 */
	public long diffieHellman (long G, long n, long X) throws RemoteException;
	
	
	
	/**
	 * Seconde méthode appelée : permet de vérifier l'authenticité des deux parties.
	 * 
	 * @param paquetChiffre Le paquet chiffré permettant l'authentification.
	 * 
	 * @return Un paquet chiffré permettant de valider l'authenticité.
	 * 
	 * @throws RemoteException
	 * @throws ClassNotFoundException
	 * @throws IOException
	 * @throws BadPaddingException
	 * @throws IllegalBlockSizeException
	 * @throws RemoteException
	 * @throws InvalidKeyException 
	 */
	public SealedObject verifierAuthenticite (SealedObject paquetChiffre) throws InvalidKeyException, ClassNotFoundException, IllegalBlockSizeException, BadPaddingException, IOException, NoSuchAlgorithmException, NoSuchPaddingException;
	
	
	
	/**
	 * Permet d'effectuer une requête sécurisée.
	 * 
	 * @param requeteChiffree La requête à effectuer, encapsulée dans l'objet PaquetRequete adapté.
	 * 
	 * @return Un paquet chiffré contenant la réponse, null si la connexion n'a pas été authentifiée avant.
	 * 
	 * @throws NoSuchPaddingException 
	 * @throws NoSuchAlgorithmException 
	 * @throws IOException 
	 * @throws BadPaddingException 
	 * @throws IllegalBlockSizeException 
	 * @throws ClassNotFoundException 
	 * @throws InvalidKeyException 
	 */
	public SealedObject effectuerRequete (SealedObject requeteChiffree) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ClassNotFoundException, IllegalBlockSizeException, BadPaddingException, IOException;
	
	
	
	/**
	 * Permet juste de voir des informations transmises en clair avec Wireshark (et donc vérifier que le chiffrement marche bien).
	 * 
	 * @param message Le message à envoyer en clair.
	 * 
	 * @return La réponse.
	 * 
	 * @throws RemoteException
	 */
	public String testEnvoiMessageClair (String message) throws RemoteException;
}
